草庐IT

C++ std::atomic 与 Boost atomic

全部标签

C++: "reset"std::next_permutation()

有没有办法“重置”std::next_permutation()?假设我想多次检查vector的排列。我唯一能找到的是交替地通过next_permutation和prev_permutation。谢谢 最佳答案 “重置”将对序列进行排序,例如使用std::sort.请注意,如果您想使用next_permutation枚举所有排列,您必须从排序序列开始。此外,std::next_permutation一旦再次达到字典序最小排列,将返回false。 关于C++:"reset"std::nex

c++ - 为什么我们应该将 `std::unique_lock` 放在本地范围内?

基于C++EquivalenttoJava'sBlockingQueuevoidpush(Tconst&value){//originalversion{std::unique_locklock(this->d_mutex);d_queue.push_front(value);}this->d_condition.notify_one();}voidpush(Tconst&value){//myquestion//{//commentoutthescopestd::unique_locklock(this->d_mutex);d_queue.push_front(value);//}/

c++ - std::atomic 库依赖项 (gcc 4.7.3)

我一直在尝试使用std::atomic进行编译,但我得到了对__atomic_load、__atomic_store和__atomic_store_16的未解析引用。我知道在更高版本的gcc(4.8+?)中包含-latomic,但我正在使用gcc4.7.3进行编译;我试过添加-latomic_ops和-latomic_ops_gpl,但两者似乎都没有太大作用。我现在正在安装gcc4.8.1,但我确实有一个真正需要为4.7.3编译的发布平台。非常感谢。编辑:好的,这是导致我遇到的问题的一些代码:atomics.cpp#include#includestructdataStruct{int

c++ - 完美转发和 std::tuple

考虑以下代码:#include#include#include//A.templatevoidf(constchar*msg,Args&&...args){std::coutvoidf(constchar*msg,std::tuple&&t){std::coutg()const{returnstd::make_tuple(2,4,12345);}};intmain(){f("First",2,5,12345);f("Second",std::make_tuple(2,5,12345));boothe_boo;f("Third",the_boo.g());f("Fourth",std::

c++ - c++ operator |= atomic 是多核处理器吗?

我目前正在与另一位开发人员争论,他向我保证以下c++语句是原子的:x|=0x1;//xissharedbymultiplethreads在Release模式下用VC++11编译生成以下程序集:01121270ordwordptrds:[1124430h],1另一个开发者说位操作是原子的,因此是线程安全的。我对英特尔i7处理器的体验与此相反。我认为对于多核处理器,任何共享内存写入都是不安全的,因为有单独的处理器缓存。但经过更多研究后,似乎x86处理器提供了一些与处理器/内核之间的内存操作顺序相关的保证,这表明它应该是安全的......同样,这不是根据我的经验,情况似乎是这样。由于我没有关

c++ - 对于简单类型C++,使用静态tmp变量重新实现std::swap()

我决定用一个inttmp变量对简单类型(例如struct或class或仅在其字段中仅使用简单类型的static)的交换函数的实现进行基准测试,以防止每次交换调用中分配内存。所以我写了这个简单的测试程序:#include#include#include#includetemplatevoidmySwap(T&a,T&b)//Likestd::swap-justfortests{Ttmp=std::move(a);a=std::move(b);b=std::move(tmp);}templatevoidmySwapStatic(T&a,T&b)//Herewithstatictmp{sta

c++ - std::make_pair 类型推导

我遇到了一些奇怪的事情,我想得到解释。以下代码片段提供了一个简单的类模板type和两个operators:一个用于type的特化和一个std::pair的type特化。#include#includetemplateclasstype{public:Tvalue_;};templatestd::basic_ostream&operator&os,typeconst&a){returnosstd::basic_ostream&operator&os,std::pairconst&a){returnosintmain(){usingfloat_type=type;float_typecon

c++ - std::array 默认初始化还是值初始化?

根据cppreference,std::array的构造函数在创建std::array时执行默认初始化。但是,当我在VisualStudio12.0中进行一些测试时,在某些情况下std::array似乎正在执行值初始化。std::arrayarr1;//givesmesomegarbagevalues,asexpectedautoarr2=std::array();//givesmethree0,value-initialize?此外,当std::array是类的成员时,有时它具有不确定的值,有时它全为零。classContainer{public:Container()...int&

c++ - 导致 C++11 std::mutex 将阻塞的线程锁定为被动等待状态?

我有以下情况:两个C++11线程正在计算,它们通过std::mutex同步。线程A锁定互斥锁,直到数据准备好供线程B执行的操作使用。当互斥量解锁时,线程B开始工作。线程B试图锁定互斥量并被阻塞,直到它被线程A解锁。voidThreadA(std::mutex*mtx,char*data){mtx->lock();//dosomethingusefulwithdatamtx->unlock();}voidThreadB(std::mutex*mtx,char*data){mtx->lock();//waituntilThreadAisready//dosomethingusefulwit

c++ - std::equal_range 与 lambda

假设我有一个字符串vector,我想找到所有以'a'开头的字符串,所以我可以这样做:structcmp{booloperator()(conststd::string&s,charc)const{returns.front()strings;...std::sort(strings.begin(),strings.end());autorange=std::equal_range(strings.begin(),strings.end(),'a',cmp{});...这种方法容易出错,容易出错(比如我觉得第二种方法应该是c),而且代码重复。那么是否可以使用通用lambda而不是使用2种